ロードバランサーでPiping Serverを負荷分散をする
#Piping_Server #Load_Balancer #HAProxy #制作物
モチベーション
パフォーマンスの向上を狙って、Piping Serverでロードバランサーを使いたい需要が出てくる。
負荷分散するときの問題点
ただ、執筆時(0.9.1)のPiping Serverではパスで状態を持つ。
状態持つ理由は、Piping Serverはポリシーとしてデータをストレージ等に保存したりしたくないため、ストリーミングされるデータは一瞬だけメモリに存在するような実装になっている。通常のPiping Sereverが1つだけのときは問題ではないが、ロードバランサーでアクセスが複数のPiping Serverに分配されるときは、送信者と受信者は同じPiping Serverにアクセスされるように調節されないといけない。
問題点の解決策 - HAProxy
Kubernetesでこの機能を探したが、今のところ発見できてなかった。HAProxyだと同じパスへのアクセスを同じサーバーに転送するように負荷分散ができることがわかった。そのため、HAProxyを使って、Docker Composeで手軽にPiping Serverたちをたてれるようにしたリポジトリを作成。
(パスベースの負荷分散の参考:)
ロードバランサーで高速化するのか?
そもそも、ロードバランサーを使えば高速するのか?という疑問がある。というのもパスベースでHTTPを解釈できるソフトウェアロードバランサーが必要になるため、トラフィックはすべてロードバランサーに集まってしまうはず。Piping Serverはin/outともにデータ量が多くなるはずで、Piping Serverの内部の処理はそれほど負荷がかかるわけでもないので、複数のPiping Serverに分散させることが高速化につながるのかはわからない。ただ、最終的にはやってみないと結論が出せないはずなので、Piping Serverの負荷分散の一つの方法として挑戦。(現在のPiping Serverの実装がシングルスレッドのNode.jsなので、コア数分Piping Serverを使うと自動的にマルチコアになるかも)
GitHubリポジトリ
https://gh-card.dev/repos/nwtgck/piping-server-load-balancer-docker-compose.svg https://github.com/nwtgck/piping-server-load-balancer-docker-compose
https://github.com/nwtgck/piping-server-load-balancer-docker-compose
動かし方
以下のコマンドで、にロードバランサーが負荷分散してれるPiping Serverが立ち上がる。
$ docker-compose up
実装
執筆時のの実装では、Piping Serverの台数は4台に設定ファイルにハードコーディングされている。
参照:https://github.com/nwtgck/piping-server-load-balancer-docker-compose/blob/62dea8bea4c415ef33589d161c07a1c5a0d7d612/haproxy.cfg#L16-L21
現状だと、ハードコーディングされているので、実際にロードバランサー付きで使いたい人は、このリポジトリを参考に自分で手を加えるスタイルになると思う。HAProxyでスケールアウト・スケールインがあとからできたらいいが、方法は見つからなかった。パスベースで負荷分散できるリバースプロキシは、HAProxy以外にもあるので、他のプロキシを使うのもいいかなと思っている。
技術とか構成とか
HAProxyによるリバースプロキシ
Docker Composeですぐに起動
CIでDocker Composeの動作テストを行っている